#!/usr/bin/python
# -*- coding:utf-8 -*-
# @author  : micah
# @time    :  
# @function: 
# @version :


def debug(func):
    def wrapper(*args, **kwargs):  # 接收被装饰的函数中的参数
        print(f'[DEBUG: enter {func.__name__}')
        return func(*args, **kwargs)  # 在内部函数中运行被装饰的函数
    return wrapper


@debug
def say(message):
    print(message)


say('今天天气不错')


"""
1.debug装饰器接收了say函数的函数引用
2.返回内层函数的函数地址
3.运行装饰器的内层函数
4.在内部函数中运行被装饰的函数
"""


class Test:
    @property  # 将一个函数的使用方式转为属性调用的方式
    def add(self):
        return 1 + 1


test = Test()
print(test.add)


"""
任何技术需要契合你的开发场景
    面向对象是万金油
        基于类的装饰器


闭包和装饰器的课件代码写两遍
    最好在编写代码的过程中将闭包的执行过程和装饰器的执行过程
        通过中文写一遍
"""